package com.codegen.gbcodegen.util;


import java.util.UUID;

public class Test_1 {

    public static void main(String[] args) {
        /**
         * JVM懒加载模式用到时才加载
         * 调用Test_1_B。str时并没有用到Test_1_B类所以不加载Test_1_B类的静态代码块
         * 直接通过调用Test_1_B,superClass找到父类str属性
         * Test_1_A的静态代码块没有执行，因为Test_1_A的str变量是直接引用指向所以不主动加载Test_1_A类，直接去内存地址获取str指向的值
         * 如果Test_1_A的str值是间接引用指向(非静态变量)JVM就主动加载Test_1_A类，静态代码块就会被执行
         */
        System.out.println(Test_1_B.str);

    }


}

class Test_1_A {


    /**
     * 静态变量在JVM准备阶段直接赋值给变量，如果是非静态变量就赋予初始值
     * （int a=10或直接声明 为 a=0）间接引用指向（运行时常量池引用）
     * (static  int a=10 为 a=10) 直接引用指向（内存地址）
     */
    public static final String str = "Test_1_A str";


    /**
     * 这种赋随机值的情况，就算是用static修饰的也会引起JVM的主动加载，因为UUID.randomUUID()不是直接引用
     */
    //public  static  final  String   str = UUID.randomUUID().toString();

    /**
     * 主动加载时执行静态代码块
     */
    static {
        System.out.println("Test_1_A");
    }

}


class Test_1_B extends Test_1_A {

    /**
     * 静态代码块在JVM没有主动加载的时候不执行
     */
    static {
        System.out.println("Test_1_B");
    }

}